/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package daw.bean;

import com.griaule.grfingerjava.GrFingerJava;
import com.griaule.grfingerjava.GrFingerJavaException;
import com.griaule.grfingerjava.MatchingContext;
import com.griaule.grfingerjava.Template;
import java.io.File;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

/**
 *
 * @author Christian
 */
@Entity
@Table(name = "usuario")
@NamedQueries({@NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
@NamedQuery(name = "Usuario.findByIdUsuario", query = "SELECT u FROM Usuario u WHERE u.idUsuario = :idUsuario"),
@NamedQuery(name = "Usuario.findByUser", query = "SELECT u FROM Usuario u WHERE u.user = :user"),
@NamedQuery(name = "Usuario.findByPassword", query = "SELECT u FROM Usuario u WHERE u.password = :password"),
@NamedQuery(name = "Usuario.findByUserAndPassword", query = "SELECT u FROM Usuario u WHERE u.user = :user and u.password = :password")})

public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idUsuario")
    private Integer idUsuario;
    @Basic(optional = false)
    @Column(name = "user")
    private String user;
    @Basic(optional = false)
    @Column(name = "password")
    private String password;
    @Lob
    @Column(name = "huellaDigital")
    private byte[] huellaDigital;
    @Lob
    @Column(name = "huellaTemplate")
    private byte[] huellaTemplate;
    @JoinColumn(name = "idRolUsuario", referencedColumnName = "idRolUsuario")
    @ManyToOne(optional = false)
    private RolUsuario idRolUsuario;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idUsuario")
    private List<Denuncia> denunciaCollection;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "usuario")
    private Persona persona;

    public Usuario() {
    }

    public Usuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Usuario(Integer idUsuario, String user, String password) {
        this.idUsuario = idUsuario;
        this.user = user;
        this.password = password;
    }

    public Integer getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Integer idUsuario) {
        this.idUsuario = idUsuario;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public byte[] getHuellaDigital() {
        return huellaDigital;
    }

    public void setHuellaDigital(byte[] huellaDigital) {
        this.huellaDigital = huellaDigital;
    }

    public byte[] getHuellaTemplate() {
        return huellaTemplate;
    }

    public void setHuellaTemplate(byte[] huellaTemplate) {
        this.huellaTemplate = huellaTemplate;
    }

    public RolUsuario getRolUsuario() {
        return idRolUsuario;
    }

    public void setRolUsuario(RolUsuario idRolUsuario) {
        this.idRolUsuario = idRolUsuario;
    }

    public List<Denuncia> getDenunciaCollection() {
        return denunciaCollection;
    }

    public void setDenunciaCollection(List<Denuncia> denunciaCollection) {
        this.denunciaCollection = denunciaCollection;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idUsuario != null ? idUsuario.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.idUsuario == null && other.idUsuario != null) || (this.idUsuario != null && !this.idUsuario.equals(other.idUsuario))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "daw.bean.Usuario[idUsuario=" + idUsuario + "]";
    }

        public String toXML(){
        String xml = "<usuario>";
        xml+="<user>"+getUser()+"</user>";
        xml+="<password>"+getPassword()+"</password>";
        xml+="<idrolusuario>"+getRolUsuario()+"</idrolusuario>";
        String tmp = "";
        if(getHuellaDigital() != null){
            tmp = Arrays.toString(getHuellaDigital());
            tmp = tmp.substring(1,tmp.length()-1);
        }
        xml+="<huelladigital>"+tmp+"</huelladigital>";
        tmp="";
        if(getHuellaTemplate() != null){
            tmp = Arrays.toString(getHuellaTemplate());
            tmp = tmp.substring(1,tmp.length()-1);
        }
        xml+="<huellatemplate>"+tmp+"</huellatemplate>";
        xml+="</usuario>";
        return xml;
    }

    public static String UsuarioCollectionToXML(List<Usuario> users){
        String xml="<usuarios>";
        Iterator i = users.iterator();
        while(i.hasNext()){
            Usuario u = (Usuario)i.next();
            xml+=u.toXML();
        }
        xml+="</usuarios>";
        return xml;
    }

    public static Usuario verificar(String usuario, byte[] templateReferencia) throws Exception{
        Template referencia = new Template(templateReferencia);
        try{
            GrFingerJava.setNativeLibrariesDirectory(new File("C:\\Program Files\\Griaule\\Fingerprint SDK Java 2007\\bin"));
            GrFingerJava.setLicenseDirectory(new File("C:\\Program Files\\Griaule\\Fingerprint SDK Java 2007\\bin"));
        }catch(Exception e){

        }
        MatchingContext contexto = new MatchingContext();
        Usuario u = null;
        //BaseDeDatos bd = new BaseDeDatos();
        //java.sql.CallableStatement cs = bd.conectar().prepareCall("{call USU_consultarPorUsuario(?)}");
//        cs.setString(1,usuario);
//
//        byte[] templateCandidato = null;
//        if(cs.execute()){
//            java.sql.ResultSet rs = cs.getResultSet();
//            if(rs.next()){
//                templateCandidato = rs.getBytes(9);
//                Template candidato = new Template(templateCandidato);
//                if(contexto.verify(candidato,referencia)){
//                    u = new Usuario(Integer.valueOf(rs.getInt(1)),
//                                    rs.getString(2),
//                                    rs.getString(3),
//                                    rs.getBoolean(4),
//                                    rs.getBoolean(5),
//                                    rs.getBytes(6),
//                                    Integer.valueOf(rs.getInt(7)),
//                                    Integer.valueOf(rs.getInt(8)));
//                    u.setHuellaTemplate(templateCandidato);
//                }
//            }
//        }
//        bd.desconectar();
        return u;
    }

     public Usuario identificar(List<Usuario> usuarios,MatchingContext contexto) throws GrFingerJavaException{
         return identificar(getHuellaTemplate(),usuarios,contexto);
     }

     public static Usuario identificar(byte[] templateReferencia, List<Usuario> usuarios, MatchingContext contexto) throws GrFingerJavaException{
        int contador = 0;
        Template referencia = new Template(templateReferencia);
        contexto.prepareForIdentification(referencia);
        Usuario u = null;

        if(usuarios != null){
            Iterator i = usuarios.iterator();
            while(i.hasNext()){
                Usuario tmp = (Usuario)i.next();
                Template candidato = new Template(tmp.getHuellaTemplate());
                if(contexto.identify(candidato)){
                    contador++;
                    System.out.println("Se encontraron "+contador+" coincidencias.");
                    u = tmp;
                    //return u;
                }
            }
        }
        return u;
    }
}
